#include <stdio.h>
#include <string.h>
#include "Dish.h"
#include "All_struct.h" 

// 工具函数：清除输入缓冲区残留的换行符（解决scanf后续读空问题）
static void clear_buf() {
    int c;
    while ((c = getchar()) != '\n' && c != EOF);
}

// 12. 菜品增加（1=成功，0=失败）
int Dish_add(Window *pWin) {
    // 边界判断：窗口不存在 或 菜品数达上限
    if (pWin == NULL) {
        printf("错误：窗口不存在！\n");
        return 0;
    }
    if (pWin->dish_count >= MAX_DISH_PER_WINDOW) {
        printf("错误：当前窗口菜品数已达上限（%d道），无法新增！\n", MAX_DISH_PER_WINDOW);
        return 0;
    }

    // 读取菜品信息（清除缓冲区避免换行符干扰）
    int new_idx = pWin->dish_count;  // 新菜品的索引（当前最后一个有效菜品的下一位）
    printf("请输入新加菜品的编号：");
    scanf("%d", &pWin->dishes[new_idx].id);
    clear_buf();  // 清除scanf后的换行符

    printf("请输入新加菜品的名称（无空格）：");
    // 用%s读无空格名称，若需支持空格，可改用fgets(pWin->dishes[new_idx].name, DISH_NAME_LEN, stdin)
    scanf("%s", pWin->dishes[new_idx].name);
    clear_buf();

    printf("请输入新加菜品的价格：");
    // 限制价格为正数（增加输入合法性校验）
    while (scanf("%f", &pWin->dishes[new_idx].price) != 1 || pWin->dishes[new_idx].price < 0) {
        clear_buf();
        printf("输入错误！请输入非负数字：");
    }
    clear_buf();

    printf("请输入新加菜品的库存：");
    // 限制库存为非负（避免负数库存）
    while (scanf("%d", &pWin->dishes[new_idx].stock) != 1 || pWin->dishes[new_idx].stock < 0) {
        clear_buf();
        printf("输入错误！请输入非负整数：");
    }
    clear_buf();

    // 新增成功：有效菜品数+1
    pWin->dish_count++;
    printf("新增菜品成功！当前窗口共%d道菜品\n", pWin->dish_count);
    return 1;
}

// 13. 删除菜品（1=成功，0=失败）
int Dish_delete(Window *pWin) {
    // 边界判断：窗口不存在 或 无菜品可删
    if (pWin == NULL) {
        printf("错误：窗口不存在！\n");
        return 0;
    }
    if (pWin->dish_count == 0) {
        printf("错误：当前窗口无菜品，无法删除！\n");
        return 0;
    }

    // 查找要删除的菜品（按编号）
    int del_id;
    printf("请输入要删除的菜品编号：");
    scanf("%d", &del_id);
    clear_buf();

    int del_idx = -1;  // 要删除的菜品索引（初始为-1，表未找到）
    for (int i = 0; i < pWin->dish_count; i++) {
        if (pWin->dishes[i].id == del_id) {
            del_idx = i;
            break;
        }
    }
    if (del_idx == -1) {
        printf("未找到编号为%d的菜品！\n", del_id);
        return 0;
    }

    // 执行删除：后面的菜品往前移，覆盖要删除的菜品
    for (int j = del_idx; j < pWin->dish_count - 1; j++) {
        pWin->dishes[j] = pWin->dishes[j + 1];  // 结构体变量可直接赋值
    }
    // 有效菜品数-1（关键：更新有效数量，避免访问无效数据）
    pWin->dish_count--;
    printf("删除菜品（编号：%d）成功！当前窗口共%d道菜品\n", del_id, pWin->dish_count);
    return 1;
}

// 14. 更新菜品信息（1=成功，0=失败）
int Dish_update(Window *pWin) {
    if (pWin == NULL) {
        printf("错误：窗口不存在！\n");
        return 0;
    }
    if (pWin->dish_count == 0) {
        printf("错误：当前窗口无菜品，无法更新！\n");
        return 0;
    }

    // 查找要更新的菜品
    int update_id;
    printf("请输入要更新的菜品编号：");
    scanf("%d", &update_id);
    clear_buf();

    int update_idx = -1;
    for (int i = 0; i < pWin->dish_count; i++) {
        if (pWin->dishes[i].id == update_id) {
            update_idx = i;
            break;
        }
    }
    if (update_idx == -1) {
        printf("未找到编号为%d的菜品！\n", update_id);
        return 0;
    }

    // 更新菜品信息（保留原信息提示，优化用户体验）
    printf("当前菜品信息：编号=%d，名称=%s，价格=%.2f，库存=%d\n",
           pWin->dishes[update_idx].id,
           pWin->dishes[update_idx].name,
           pWin->dishes[update_idx].price,
           pWin->dishes[update_idx].stock);

    printf("请输入新的菜品编号：");
    scanf("%d", &pWin->dishes[update_idx].id);
    clear_buf();

    printf("请输入新的菜品名称（无空格）：");
    scanf("%s", pWin->dishes[update_idx].name);
    clear_buf();

    printf("请输入新的菜品价格：");
    while (scanf("%f", &pWin->dishes[update_idx].price) != 1 || pWin->dishes[update_idx].price < 0) {
        clear_buf();
        printf("输入错误！请输入非负数字：");
    }
    clear_buf();

    printf("请输入新的菜品库存：");
    while (scanf("%d", &pWin->dishes[update_idx].stock) != 1 || pWin->dishes[update_idx].stock < 0) {
        clear_buf();
        printf("输入错误！请输入非负整数：");
    }
    clear_buf();

    printf("更新菜品（编号：%d）成功！\n", update_id);
    return 1;
}

// 15. 查找指定菜品（1=成功，0=失败）
int Dish_find(Window *pWin) {
    if (pWin == NULL) {
        printf("错误：窗口不存在！\n");
        return 0;
    }
    if (pWin->dish_count == 0) {
        printf("错误：当前窗口无菜品，无法查找！\n");
        return 0;
    }

    // 查找菜品
    int find_id;
    printf("请输入要查找的菜品编号：");
    scanf("%d", &find_id);
    clear_buf();

    for (int i = 0; i < pWin->dish_count; i++) {
        if (pWin->dishes[i].id == find_id) {
            // 修正：去掉&，直接输出变量值（而非地址）
            printf("================ 菜品信息 ================\n");
            printf("菜品编号：%d\n", pWin->dishes[i].id);
            printf("菜品名称：%s\n", pWin->dishes[i].name);
            printf("菜品价格：%.2f元\n", pWin->dishes[i].price);  // 去掉&
            printf("菜品库存：%d道\n", pWin->dishes[i].stock);    // 去掉&
            printf("==========================================\n");
            return 1;
        }
    }

    printf("未找到编号为%d的菜品！\n", find_id);
    return 0;
}